﻿//1669. 合并两个链表
//给你两个链表 list1 和 list2 ，它们包含的元素分别为 n 个和 m 个。
//请你将 list1 中下标从 a 到 b 的全部节点都删除，并将list2 接在被删除节点的位置。
//请你返回结果链表的头指针。


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2)
    {
        ListNode hair(-1);
        hair.next = list1;
        auto p = &hair;
        ListNode* prev, * tail;
        int i = 0;
        while (p->next)
        {
            auto n = p->next;
            if (i == a)
            {
                prev = p;
            }
            if (i == b)
            {
                tail = n->next;
            }
            p = p->next;
            i++;
        }
        prev->next = list2;
        p = prev;
        while (p->next->next)
        {
            p = p->next;
        }
        p->next->next = tail;
        return hair.next;
    }
};